/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BeansGerenciaveis;

import DAO.AutorDao;
import DAO.Conexao;
import bean.Autor;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

/**
 *
 * @author fernando
 */
@ManagedBean
@SessionScoped
public class AutorBean implements Serializable {

    public AutorBean() {
        this.autor = new Autor();
        this.autorDao = new AutorDao();
        
        
        this.autorDao = new AutorDao();
        
        this.autorSelecionado = new Autor();


    }
    @PostConstruct
    public void init(){
        if(listaAutoresSimplificado!=null){
            this.listaAutoresSimplificado = autorDao.listarAutoresSimplficado();
            System.out.println("AutorBean - init - Lista autores simplficado inicializada!");
        }
    }
    
    
    /*
     public void selecionar() {
     if(autorSelecionado != null){
     autor = autorSelecionado;
     System.out.println("Autor Selecionado: "+autorSelecionado.getUltimoNome());
     }else{
            
     autor = autores.getRowData();
     System.out.println("Segundo Else: "+autor.getUltimoNome());
     }
        
        
     //autor = autorSelecionado;

     }*/

    public void selecionar() {
        autor = autores.getRowData();
    }

    public PreparedStatement getPs() {
        return ps;
    }

    public void setPs(PreparedStatement ps) {
        this.ps = ps;
    }

    public boolean isSucesso() {
        return sucesso;
    }

    public void setSucesso(boolean sucesso) {
        this.sucesso = sucesso;
    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }

    public Autor getAutor() {
        return autor;
    }

    public void setAutor(Autor autor) {
        this.autor = autor;
    }

    public AutorDao getAutorDao() {
        return autorDao;
    }

    public void setAutorDao(AutorDao autorDao) {
        this.autorDao = autorDao;

    }

    public Autor getAutorSelecionado() {
        return autorSelecionado;
    }

    public void setAutorSelecionado(Autor autorSelecionado) {
        this.autorSelecionado = autorSelecionado;
    }

    public void novoAutor() {
        this.autor = new Autor();
        this.carregarAutores();


    }

    public void cadastroAutor() {
        String resultado = "/cadastros/acaoErro";

        autorDao = new AutorDao();
        System.out.println("AutorBean: Dados que serão adicionados");
        System.out.println("Ultimo Nome:" + autor.getUltimoNome());
        System.out.println("Restante Nome: " + autor.getRestanteNome());
        System.out.println("Id Intituicao: " + autor.getInstituicaoAutor().getId());
        System.out.println("Lattes:" + autor.getLattes());
        if (autorDao.validarAutorJaCadastrado(autor)) {

            sucesso = autorDao.cadastrarAutor(autor);

            if (sucesso) {
                Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
                String username;
                if (principal instanceof UserDetails) {
                    username = ((UserDetails) principal).getUsername();
                } else {
                    username = principal.toString();
                }
                this.novoAutor();
                this.carregarAutores();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(username.toUpperCase() + " Autor Cadastrado com Sucesso!  "));



            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Ocorreu um erro ao cadastrar o autor."));

            }
        } else {
            this.novoAutor();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Autor já se encontra cadastrado na base de dados"));

        }


    }

    public void validarAutoJaCadastrado(FacesContext context, UIComponent toValidate, Object value) {

        if (!autorDao.validarAutorJaCadastrado(autor)) {
            ((UIInput) toValidate).setValid(false);

            FacesMessage message = new FacesMessage(" Autor já cadastrado ");
            context.addMessage(toValidate.getClientId(context), message);
        }
    }

    public List<Autor> getListaAutores() {
        if(listaAutores == null){
            this.carregarAutores();
        }
        return listaAutores;
    }

    public void setListaAutores(List listaAutores) {
        this.listaAutores = listaAutores;
    }

    public DataModel<Autor> getAutores() {
        if(listaAutores == null){
            this.carregarAutores();
        }
        return autores;

    }

    public void setAutores(DataModel<Autor> autores) {
        this.autores = autores;
    }

    public List<Autor> listarAutor() {
        System.out.println("Fui executado!");
        
        listaAutores = autorDao.listarAutores();
        return listaAutores;
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String removerAutor() {
        String resultado = "/cadastros/acaoErro";
        autorDao = new AutorDao();
        sucesso = autorDao.removerAutor(autor);

        if (sucesso) {
            this.novoAutor();
            this.carregarAutores();
            return "/cadastros/acaoSucesso";
        }

        return resultado;
    }

    public String editarAutor() {
        String resultado = "/cadastros/acaoErro";

        autorDao = new AutorDao();
        sucesso = autorDao.alterarAutor(autor);

        if (sucesso) {
            this.novoAutor();
            this.carregarAutores();
            resultado = "/cadastros/acaoSucesso";
        }

        return resultado;
    }

    public void carregarAutores() {
        autorDao = new AutorDao();
        listaAutores = autorDao.listarAutores();
        listaAutoresSimplificado = autorDao.listarAutoresSimplficado();
        autores = new ListDataModel<Autor>(listaAutores);
    }

    public List<Autor> getFiltroAutores() {
        return filtroAutores;
    }

    public void setFiltroAutores(List<Autor> filtroAutores) {
        this.filtroAutores = filtroAutores;
    }

    public List<Autor> getListaAutoresSimplificado() {
        if(listaAutoresSimplificado == null){
            this.carregarAutores();
        }
        return listaAutoresSimplificado;
    }

    public void setListaAutoresSimplificado(List listaAutoresSimplificado) {
        this.listaAutoresSimplificado = listaAutoresSimplificado;
    }

    public List getListaAutoresComObra() {
        if(listaAutoresComObra == null){
            this.listaAutoresComObra = autorDao.listarAutoresComObras();
        }
        return listaAutoresComObra;
    }

    public void setListaAutoresComObra(List listaAutoresComObra) {
        this.listaAutoresComObra = listaAutoresComObra;
    }
    
    
    
    
    private PreparedStatement ps;
    private List<Autor> filtroAutores;
    private Autor autorSelecionado;
    private boolean sucesso = false;
    private Conexao conexao;
    private Autor autor;
    private DataModel<Autor> autores;
    private List listaAutores;
    private List listaAutoresSimplificado;
    private AutorDao autorDao;
    private List listaAutoresComObra;
}
